package com.lavender.annotation._import;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @Import 原理解析：https://juejin.cn/post/6844903925242396686
 * <p>
 * 一：@Import(TestConfig.class)：导入带@Configuration的配置类TestConfig。
 * #适用场景：带@Configuration的配置类TestConfig不在@SpringBootApplication的扫描范围内，则不会被spring扫描到（比如依赖Jar包里面的类）。
 * #解决方式：
 * 1：使用@ComponentScan("com.**")注解扫描多个包。
 * 2：使用@Import注解引入配置类。
 * </p>
 *
 * <p>
 * 二：@Import(ImportTest.class)：导入常规class，可将class声明为Bean。
 * # 使用场景：可以导入jar包里面的类，将其声明为Bean。
 * </p>
 *
 * <p>
 * 三：@Import(ImportTestBeanDefinitionRegister.class)：导入实现了ImportBeanDefinitionRegistrar的实现类，将Bean注册到spring。
 * #使用场景：
 *  spring官方就是用这种方式，实现了@Component、@Service等注解的动态注入机制。
 *  能够实现快速的、批量的、扫描式的注册，
 *  e.g：
 *  ServletComponentScanRegistrar就是去解析注解@ServletComponentScan。
 *  MapperScannerRegistrar就是MyBatis用来解析@MapperScan注解。
 *
 * # 参考：https://juejin.cn/post/6844903971119693837
 * </p>
 *
 * <p>
 * 四：@Import(ImportTestImportSelector.class)：导入实现了ImportSelector的实现类，将Bean注册到spring。
 * #适用场景：带@Configuration的配置类不在@SpringBootApplication的扫描范围内，选择性的将Bean注册到Spring容器中。
 * #@Import(ImportSelector)和@Import(带@Configuration的配置类)的区别：
 * 1：@Import(带@Configuration的配置类)：会将配置类中的所有@Bean都导入到Spring容器中。
 * 2：@Import(ImportSelector)：允许我们根据条件动态选择想导入的配置类，通过#selectImports选择导入，通过#getExclusionFilter排除。
 * </p>
 *
 * @author: zhu.chen
 * @date: 2020/12/5
 * @version: v1.0.0
 */
//@Import(TestConfig.class)
//@Import(ImportTest.class)
//@Import(ImportTestBeanDefinitionRegister.class)
@Import(ImportTestImportSelector.class)
@Configuration
public class ImportConfig {

}
